package com.cscp.javastudy.juc.volatiledemo;

/**
 * 懒汉式单例
 */
public class SingletonDemo2 {

    private SingletonDemo2(){}

    private static volatile SingletonDemo2 instance;

    public static SingletonDemo2 getInstance(){
        //位置1
        if (instance == null) {
            synchronized (SingletonDemo2.class){
                if (instance == null){
                    /*
                     * 1- 分配内存空间
                     * 2- 执行构造方法，初始化对象
                     * 3- 把这个对象指向这个空间
                     * 执行顺序 123
                     * 由于指令重排也有可能执行顺序为132，此时，如果有另外一个线程B执行到位置1，发现instance不为null，但这时
                     * 并没有执行第二步，意味着数据还没有初始化，这时线程B拿到的数据就有问题
                     */
                    instance = new SingletonDemo2();//这不是一个原子操作
                }
            }
        }
        return instance;
    }
}
